#pragma once
#include <memory>
#include <QQuickItem>
#include <QQuickFramebufferObject>

#include "yuvloader.h"
// Qt5.2以后，QQuickFramebufferObject是官方推荐的将自定义opengl渲染代码嵌入到qml中的方式
// 基本原理是：自己实现了一个继承于QQuickFramebufferObject的qml Item，通过重写QQuickFramebufferObject::createRenderer函数返回自定义的渲染器QQuickFramebufferObject::Renderer
// QQuickFramebufferObject::Renderer中创建了一个QOpenGLFramebufferObject，我们直接在QQuickFramebufferObject::Renderer中写自定义opengl代码，最终会渲染到QOpenGLFramebufferObject上
// 然后qml负责渲染QOpenGLFramebufferObject到窗口

// 注意事项：
// 1. qml Item和QQuickFramebufferObject::Renderer在两个线程中，注意通信方式
// 2. QQuickFramebufferObject大小和最终Item显示大小可以不一样（textureFollowsItemSizeChanged）
// 3. 注意重置opengl状态，使自定义渲染代码和qml渲染不相互影响(resetOpenGLState)

// 参考文档：
// https://www.qt.io/blog/2015/05/11/integrating-custom-opengl-rendering-with-qt-quick-via-qquickframebufferobject
// https://github1s.com/jaredtao/QmlFFmpegPlayer
// https://doc.qt.io/qt-5/qquickframebufferobject.html

class YUVItem : public QQuickFramebufferObject
{
    Q_OBJECT
public:
    YUVItem(QQuickItem *parent = nullptr);    
    int videoWidth() const
    {
        return m_videoWidth;
    }
    int videoHeght() const
    {
        return m_videoHeight;
    }

    Renderer *createRenderer() const override;
    const YUVData& getFrame();

public slots:
    void OnFrameAvailable(const YUVData& frame);

private:
    int m_videoWidth = 320;
    int m_videoHeight = 180;
    YUVLoader m_yuvLoader;
    YUVData m_frame;
};
